package com.merry.aop.advice;

import org.aopalliance.intercept.Interceptor;
import org.aopalliance.intercept.Joinpoint;
import org.aopalliance.intercept.MethodInvocation;

/**
 * 该接口是 Interceptor 的一个子接口，表示专门拦截方法的。案例代码如下：
 *
 * <pre class=code>
 * class TracingInterceptor implements MethodInterceptor {
 *   Object invoke(MethodInvocation i) throws Throwable {
 *     System.out.println("method "+i.getMethod()+" is called on "+
 *                        i.getThis()+" with args "+i.getArguments());
 *     Object ret=i.proceed();
 *     System.out.println("method "+i.getMethod()+" returns "+ret);
 *     return ret;
 *   }
 * }
 * </pre>
 *
 * @author Rod Johnson
 */
@FunctionalInterface
public interface MethodInterceptor extends Interceptor {

    /**
     * 调用该方法，以完成实际方法的调用。他的入参 {@link MethodInvocation} 是 {@link Joinpoint} 的一个子接口，专门表示当前方法的，是一个可以执行的方法。
     * 通过 {@link Joinpoint#proceed()} 方法完成它的调用。
     */
    Object invoke(MethodInvocation invocation) throws Throwable;

}
